package 反射.reflect;

import org.junit.Test;

import java.lang.reflect.Method;

/**
 * 获取类的成员方法
 */
public class testMethod {
    @Test
    public void testGetMethods() throws Exception {
        //1.获取Class对象
        Class c = Cat.class;
        //2.获取类的全部成员方法
        Method[] methods = c.getDeclaredMethods();
        //3.遍历这个数组中的方法对象
        for (Method method : methods) {
            System.out.println(method.getName()+"--->"
                    +method.getParameterCount()+"--->"
            +method.getReturnType());
        }

        //4.获取某个方法对象
        Method run = c.getDeclaredMethod("run");//拿无参数的run方法
        System.out.println(run.getName()+"--->"
                +run.getParameterCount()+"--->"
                +run.getReturnType());

        Method eat = c.getDeclaredMethod("eat", String.class);
        System.out.println(eat.getName()+"--->"
                +eat.getParameterCount()+"--->"
                +eat.getReturnType());


        Cat cat=new Cat();
        run.setAccessible(true);//暴力反射，谁要被调用，就设置谁
        //5.执行获得的方法
        Object invoke = run.invoke(cat);//用cat对象调用run方法
        System.out.println(invoke);//没有返回值，输出null


        //调用有参数方法
        eat.setAccessible(true);
        Object invoke1 = eat.invoke(cat,"传递的参数");
        System.out.println(invoke1);
    }
}
